// Electron打包配置
import { MakerDeb } from '@electron-forge/maker-deb';
import { MakerDMG } from '@electron-forge/maker-dmg';
import { MakerPKG } from '@electron-forge/maker-pkg';
import { MakerRpm } from '@electron-forge/maker-rpm';
import { MakerSquirrel } from '@electron-forge/maker-squirrel';
import { MakerZIP } from '@electron-forge/maker-zip';
import { FusesPlugin } from '@electron-forge/plugin-fuses';
import { VitePlugin } from '@electron-forge/plugin-vite';
import type { ForgeConfig } from '@electron-forge/shared-types';
import { FuseV1Options, FuseVersion } from '@electron/fuses';

const config: ForgeConfig = {
  // 打包输出目录
  outDir: 'out',
  // 允许您自定义 @electron/packager 如何将基于 Electron 的应用程序源代码打包为准备好分发的打包应用程序
  packagerConfig: {
    asar: true,
    icon: 'public/icon/app.ico'
  },
  // 直接映射到在Electron Forge 的Package和Start命令期间发送到 @electron/rebuild 的选项
  rebuildConfig: {},
  // 制作器（Makers）是 Electron Forge 将您的打包应用程序制作成平台特定的可分发文件（如 DMG、EXE 或 Flatpak 文件等）的方式。
  // 每个制作器都必须在您的 forge 配置的“makers”部分中进行配置，包括要运行的平台和制作器特定的配置
  makers: [
    // windows系统
    new MakerSquirrel({ iconUrl: 'public/icon/app.ico', setupIcon: 'public/icon/app.ico' }),
    //  Electron 应用创建一个 ZIP 压缩包。ZIP 目标构建基本的 .zip 压缩包
    // 其中包含您的打包应用程序。使用此制作器没有平台特定的依赖项，并且它可以在任何平台上运行
    new MakerZIP({}, ['darwin', 'linux']),
    // 在 macOS上分发您的Electron应用程序。DMG目标构建的是Apple磁盘映像（.dmg）文件，这是共享 macOS 应用程序的标准格式
    new MakerDMG({ appPath: './out/dmg', background: 'public/icon/app.png', format: 'ULFO' }),
    //  macOS上创建一个.pkg文件，这些安装程序用于将您的应用程序上传到 Mac App Store (MAS)
    new MakerPKG({}),
    // RedHat的Linux发行版创建一个 RPM 软件包
    new MakerRpm({}),
    // Debian的Linux发行版的软件包
    new MakerDeb({
      options: {
        icon: 'public/icon/app.ico'
      }
    })
  ],
  // 插件可以挂钩到其生命周期的任何点，并提供额外的功能
  // 例如，Webpack插件会将webpack打包集成到构建生命周期中，Electronegativity插件会在您的应用程序中识别安全反模式
  plugins: [
    new VitePlugin({
      // `build` 可以指定多个入口构建，这些入口可以是主进程、预加载脚本、工作进程等
      // 你必须提供两个Vite 配置文件：一个用于主进程(build)，在vite.main.config.js中；
      // 另一个用于渲染进程(renderer)，在vite.renderer.config.js中。
      build: [
        {
          // `entry` 只是config对应文件中build.lib.entry的别名.
          entry: 'src/main.ts',
          config: 'vite.main.config.ts',
          target: 'main'
        },
        {
          entry: 'src/preload.ts',
          config: 'vite.preload.config.ts',
          target: 'preload'
        }
      ],
      renderer: [
        {
          name: 'main_window',
          config: 'vite.renderer.config.ts'
        }
      ]
    }),
    // Fuses are used to enable/disable various Electron functionality
    // at package time, before code signing the application
    new FusesPlugin({
      version: FuseVersion.V1,
      [FuseV1Options.RunAsNode]: false,
      [FuseV1Options.EnableCookieEncryption]: true,
      [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false,
      [FuseV1Options.EnableNodeCliInspectArguments]: false,
      [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true,
      [FuseV1Options.OnlyLoadAppFromAsar]: true
    })
  ]
};

export default config;
